package com.sybil.ot.dominio;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "SIL_EVENTOS_FLUJO")
public class Evento implements Serializable {

   private static final long serialVersionUID = 1L;
   protected EventoPK llave;
   private String descripcion;
   private String descripcionCorta;
   private String tipoAprobacion;
   private int numeroAprobadores;
   private String validaForzosos;
   private String requiereCausa;
   private String tipoCausa;
   private String usuarioCreo;
   private String usuarioModif;
   private Paso paso;
   private Paso pasoSiguiente;
   private Paso pasoSiguienteMonto;
   private String clavePasoSiguiente;
   private String clavePasoSiguienteMonto;

   public Evento() {
   }

   public Evento(EventoPK llave) {
      this.llave = llave;
   }

   public Evento(String claveFlujo, String clavePaso, String claveEvento) {
      this.llave = new EventoPK(claveFlujo, clavePaso, claveEvento);
   }

   public Evento(EventoPK llave, String descripcion, String tipoAprobacion, 
           int numeroAprobadores, String validaForzosos, String requiereCausa) {
      this.llave = llave;
      this.descripcion = descripcion;
      this.tipoAprobacion = tipoAprobacion;
      this.numeroAprobadores = numeroAprobadores;
      this.validaForzosos = validaForzosos;
      this.requiereCausa = requiereCausa;
   }

   @Valid
   @EmbeddedId
   public EventoPK getLlave() {
      return llave;
   }

   public void setLlave(EventoPK llave) {
      this.llave = llave;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 4)
   @Column(name = "EVFL_PAFL_FLUJO")
   public String getClavePasoSiguiente() {
      return clavePasoSiguiente;
   }

   public void setClavePasoSiguiente(String clavePasoSiguiente) {
      this.clavePasoSiguiente = clavePasoSiguiente;
   }

   @Size(max = 4)
   @Column(name = "EVFL_PAFL_MONTO")
   public String getClavePasoSiguienteMonto() {
      return clavePasoSiguienteMonto;
   }

   public void setClavePasoSiguienteMonto(String clavePasoSiguienteMonto) {
      this.clavePasoSiguienteMonto = clavePasoSiguienteMonto;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 100, message = "La Descripción debe tener entre 1 y 100 caracteres")
   @Column(name = "EVFL_DESCRIPCION")
   public String getDescripcion() {
      return descripcion;
   }

   public void setDescripcion(String descripcion) {
      this.descripcion = descripcion;
   }

   @Size(max = 15, message = "La longitud máxima son 15 caracteres")
   @Column(name = "EVFL_DESC_CORTA")
   public String getDescripcionCorta() {
      return descripcionCorta;
   }

   public void setDescripcionCorta(String descripcionCorta) {
      this.descripcionCorta = descripcionCorta;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 1)
   @Column(name = "EVFL_TIPO_APROBACION")
   public String getTipoAprobacion() {
      return tipoAprobacion;
   }

   public void setTipoAprobacion(String tipoAprobacion) {
      this.tipoAprobacion = tipoAprobacion;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "EVFL_NUMERO_APROBADORES")
   public int getNumeroAprobadores() {
      return numeroAprobadores;
   }

   public void setNumeroAprobadores(int numeroAprobadores) {
      this.numeroAprobadores = numeroAprobadores;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 1)
   @Column(name = "EVFL_VALIDA_FORZOSOS")
   public String getValidaForzosos() {
      return validaForzosos;
   }

   public void setValidaForzosos(String validaForzosos) {
      this.validaForzosos = validaForzosos;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 1)
   @Column(name = "EVFL_REQUIERE_CAUSA")
   public String getRequiereCausa() {
      return requiereCausa;
   }

   public void setRequiereCausa(String requiereCausa) {
      this.requiereCausa = requiereCausa;
   }

   @Size(max = 2)
   @Column(name = "EVFL_TIPO_CAUSA")
   public String getTipoCausa() {
      return tipoCausa;
   }

   public void setTipoCausa(String tipoCausa) {
      this.tipoCausa = tipoCausa;
   }

   @Basic(optional = false)
   @Column(name = "EVFL_USUARIO_CREO")
   public String getUsuarioCreo() {
      return usuarioCreo;
   }

   public void setUsuarioCreo(String usuarioCreo) {
      this.usuarioCreo = usuarioCreo;
   }

   @Column(name = "EVFL_USUARIO_MODIF")
   public String getUsuarioModif() {
      return usuarioModif;
   }

   public void setUsuarioModif(String usuarioModif) {
      this.usuarioModif = usuarioModif;
   }

   @ManyToOne(optional = false, fetch = FetchType.EAGER)
   @JoinColumns({
      @JoinColumn(name = "EVFL_FLUJ_CLAVE", referencedColumnName = "PAFL_FLUJ_CLAVE", insertable = false, updatable = false),
      @JoinColumn(name = "EVFL_PAFL_ORIGEN", referencedColumnName = "PAFL_CLAVE", insertable = false, updatable = false)})
   public Paso getPaso() {
      return paso;
   }

   public void setPaso(Paso pasoOrigen) {
      this.paso = pasoOrigen;
   }

   @OneToOne(optional = false)
   @JoinColumns({
      @JoinColumn(name = "EVFL_FLUJ_CLAVE", referencedColumnName = "PAFL_FLUJ_CLAVE", insertable = false, updatable = false),
      @JoinColumn(name = "EVFL_PAFL_FLUJO", referencedColumnName = "PAFL_CLAVE", insertable = false, updatable = false)})
   public Paso getPasoSiguiente() {
      return pasoSiguiente;
   }

   public void setPasoSiguiente(Paso pasoSiguiente) {
      if (pasoSiguiente != null) {
         this.clavePasoSiguiente = pasoSiguiente.llave.getClavePaso();
      }
      this.pasoSiguiente = pasoSiguiente;
   }

   @OneToOne(optional = true)
   @JoinColumns({
      @JoinColumn(name = "EVFL_FLUJ_CLAVE", referencedColumnName = "PAFL_FLUJ_CLAVE", insertable = false, updatable = false),
      @JoinColumn(name = "EVFL_PAFL_MONTO", referencedColumnName = "PAFL_CLAVE", insertable = false, updatable = false)})
   public Paso getPasoSiguienteMonto() {
      return pasoSiguienteMonto;
   }

   public void setPasoSiguienteMonto(Paso pasoSiguienteMonto) {
      if (pasoSiguienteMonto != null) {
         this.clavePasoSiguienteMonto = pasoSiguienteMonto.llave.getClavePaso();
      }
      this.pasoSiguienteMonto = pasoSiguienteMonto;
   }

   @Override
   public int hashCode() {
      int hash = 0;
      hash += (llave != null ? llave.hashCode() : 0);
      return hash;
   }

   @Override
   public boolean equals(Object object) {
      if (!(object instanceof Evento)) {
         return false;
      }
      Evento other = (Evento) object;
      if ((this.llave == null && other.llave != null) || (this.llave != null && !this.llave.equals(other.llave))) {
         return false;
      }
      return true;
   }

   @Override
   public String toString() {
      return "Evento[ llave=" + llave + " ]";
   }
}
